4.4 map
大部分的编程语言都有map
这样的数据类型,只是在叫法上有所差异。
在Go
语言中,map
在实际应用中也是使用比较多的一种数据类型,主要可以用于去重、快速查找等场景。
本节代码存放目录为 lesson9
什么是map?
map
可以叫做集合,也可以更直观的叫做键值对存储,或者可以参照其他语言叫做字典。
map
很直观的理解就是,它是可以存储两个值,一个叫做键key
,一个叫做数值value
,通过键key
我们可以获取到实际的值value
。
map
的存储结构如下所示:
A: 1
B: 2
C: 3
D: 4
从上面的表示我们可以看出,map
存储的就是两个值,A
是key
,1
是value,所以我们通过A
来获取,就可以知道它的实际值为1
。
map
与我们日常生活中使用的字典其实是很相近的,就是通过一个目录可以找到它实际对应的章节,而且这些目录是不会重复的。
map声明及初始化
map
的声明方式有三种,一种是使用var
与make
配合,一种是使用make
直接创建,另外一种是使用map
在声明是赋值实现初始化。如下所示:
var a map[string]int
a = make(map[string]int)
在上面的代码中,我们首先使用var
声明了一个map
的变量,之后通过make
对这个变量进行了初始化。
需要注意的是,如果使用这种方式,那么必须要使用make
进行初始化,否则在运行的时候是会报错的。
同时我们也可以指定长度,如果不指定的话,map
会自动扩容。如下所示,我们在make
时指定了map
长度为10
。
var a map[string]int
a = make(map[string]int, 10)
我们也可以直接使用make
对map
进行声明同时进行初始化。如下所示:
var b = make(map[string]int)
// 简写
b := make(map[string]int)
在上面的代码中,我们通过make
创建了一个map
,这样的方式是比较简洁的。
还有一种方式就是我们在声明的时候就为map
赋值,那么这样就可以自动完成了初始化。如下所示:
var c = map[string]int{
"A": 1,
}
在map
中,key
可以是基本数据类型,例如:int、int32、int64、float32、string、bool
等,但是不能为:数组、切片、结构体、接口、map
。
总之就是,map
的key
必须是可以比较的,否则都是不符合规则的。
value
则可以是任何类型的,包括:基本数据类型、复合数据类型、函数等。
map的操作
map
的操作主要包含添加、删除、获取、遍历等操作。
添加数据比较简单,map
声明后直接赋值即可。如下所示:
a["A"] = 1
在上面的代码中,添加了一个key
为A
,value
为1
的键值对。
元素的删除我们可以使用delete
方法。如下所示:
delete(a, "A")
获取值也比较简单,如下所示:
fmt.Println(a["A"])
在获取值的时候,我们还有另一种方式,如下所示:
ok, value := a["A"]
fmt.Println(ok)
fmt.Println(value)
在上面的代码中,我们使用ok
、value
两个值来获取接收结果。
其中ok
表示在map
中是否有key
为A
的值,如果有的话ok
等于true
,否则为false
。
value
表示实际获取到的值,同时如果不存在的话,那么value
就是map
值类型的默认值。
比如这里的map
类型是map[string]int
,那么value
的默认值就是0
。
如果是这样map[int]string
,此时value
的类型为string
,那么默认值就是空字符串。
对于map
的遍历就比较简单,与之前我们讲到的数组、切片是差不多的,只不过不同的是map
只能使用for range
进行遍历。如下所示:
var c = map[string]int{
"A": 1,
"B": 2,
}
for key, value := range c {
fmt.Printf("key-> %s, value-> %d\n", key, value)
}
需要注意的是,map
是无序的,也就是说,使用for range
遍历时,你会发现每次的输出结果都是不一样的。
结果输出如下:
key-> B, value-> 2
key-> A, value-> 1
小结
map
是一种常用的数据类型,通过map
可以快捷的进行一些数据操作。针对本节总结如下:
可以通过
var
与make
结合进行声明及初始化可以通过
make
同时完成声明及初始化map
可以通过var
直接进行声明并赋值key
是不能重复的key
必须是可以相比较的value
可以是任意类型的值可以通过
delete
删除键值对存储的
key
是无序的可以通过
for range
进行遍历